#ifndef __KERNEL_KEYBOARD_H__
#define __KERNEL_KEYBOARD_H__

#include "std/list.h"
#include "arch/cpu.h"

#ifdef __cplusplus
extern "C" {
#endif

// definition of all key
#define KEY_ESC				(0x01)
#define KEY_1				(0x02)
#define KEY_2				(0x03)
#define KEY_3				(0x04)
#define KEY_4				(0x05)
#define KEY_5				(0x06)
#define KEY_6				(0x07)
#define KEY_7				(0x08)
#define KEY_8				(0x09)
#define KEY_9				(0x0A)
#define KEY_0				(0x0B)
#define KEY_HYPHEN			(0x0C)
#define KEY_EQUAL			(0x0D)
#define KEY_BACKSPACE		(0x0E)
#define KEY_TAB				(0x0F)
#define KEY_Q				(0x10)
#define KEY_W				(0x11)
#define KEY_E				(0x12)
#define KEY_R				(0x13)
#define KEY_T				(0x14)
#define KEY_Y				(0x15)
#define KEY_U				(0x16)
#define KEY_I				(0x17)
#define KEY_O				(0x18)
#define KEY_P				(0x19)
#define KEY_LEFT_SQR_BRKT	(0x1A)
#define KEY_RIGHT_SQR_BRKT	(0x1B)
#define KEY_ENTER			(0x1C)
#define KEY_LEFT_CTRL		(0x1D)
#define KEY_A				(0x1E)
#define KEY_S				(0x1F)
#define KEY_D				(0x20)
#define KEY_F				(0x21)
#define KEY_G				(0x22)
#define KEY_H				(0x23)
#define KEY_J				(0x24)
#define KEY_K				(0x25)
#define KEY_L				(0x26)
#define KEY_SEMICOLON		(0x27)
#define KEY_SINGLE_QUOTE	(0x28)
#define KEY_BACK_TICK		(0x29)
#define KEY_LEFT_SHFT		(0x2A)
#define KEY_BACKSLASH		(0x2B)
#define KEY_Z				(0x2C)
#define KEY_X				(0x2D)
#define KEY_C				(0x2E)
#define KEY_V				(0x2F)
#define KEY_B				(0x30)
#define KEY_N				(0x31)
#define KEY_M				(0x32)
#define KEY_COMMA			(0x33)
#define KEY_POINT			(0x34)
#define KEY_SLASH			(0x35)
#define KEY_RIGHT_SHFT		(0x36)
#define KEY_KEYPAD_ASTERISK	(0x37)
#define KEY_LEFT_ALT		(0x38)
#define KEY_SPACE			(0x39)
#define	KEY_CAPSLOCK		(0x3A)
#define KEY_F1				(0x3B)
#define KEY_F2				(0x3C)
#define KEY_F3				(0x3D)
#define KEY_F4				(0x3E)
#define KEY_F5				(0x3F)
#define KEY_F6				(0x40)
#define KEY_F7				(0x41)
#define KEY_F8				(0x42)
#define KEY_F9				(0x43)
#define KEY_F10				(0x44)
#define KEY_NUMLOCK			(0x45)
#define KEY_SCROLLLOCK		(0x46)
#define KEY_KEYPAD_7		(0x47)
#define KEY_KEYPAD_8		(0x48)
#define KEY_KEYPAD_9		(0x49)
#define KEY_KEYPAD_HYPHEN	(0x4A)
#define KEY_KEYPAD_4		(0x4B)
#define KEY_KEYPAD_5		(0x4C)
#define KEY_KEYPAD_6		(0x4D)
#define KEY_KEYPAD_PLUS		(0x4E)
#define KEY_KEYPAD_1		(0x4F)
#define KEY_KEYPAD_2		(0x50)
#define KEY_KEYPAD_3		(0x51)
#define KEY_KEYPAD_0		(0x52)
#define KEY_KEYPAD_POINT	(0x53)

/* 0x54 - 0x56 is reserved */

#define KEY_F11				(0x54)
#define KEY_F12				(0x55)

/* 0x59 - 0xFF is reserved */
#define KEY_KEYPAD_ENTER	(0x56)
#define KEY_RIGHT_CTRL		(0x57)
#define KEY_KEYPAD_SLASH	(0x58)
#define KEY_RIGHT_ALT		(0x59)
#define KEY_HOME			(0x5A)
#define KEY_CUR_UP			(0x5B)
#define KEY_PAGE_UP			(0x5C)
#define KEY_CUR_LEFT		(0x5D)
#define KEY_CUR_RIGHT		(0x5E)
#define KEY_END				(0x5F)
#define KEY_CUR_DOWN		(0x60)
#define KEY_PAGE_DOWN		(0x61)
#define KEY_INSERT			(0x62)
#define KEY_DEL				(0x63)
#define KEY_WIN				(0x64)
#define KEY_ACPI_POWER		(0x65)
#define KEY_ACPI_SLEEP		(0x66)
#define KEY_ACPI_WAKE		(0x67)
#define KEY_PRNT_SCR		(0x68)
#define KEY_PAUSE			(0x69)
#define KEY_MAX				KEY_PAUSE		// ! must be less then 128

/*
0xE0, 0x1C	(keypad) enter pressed					0xE0, 0x9C	(keypad) enter released
0xE0, 0x1D	right control pressed					0xE0, 0x9D	right control released	
0xE0, 0x35	(keypad) / pressed						0xE0, 0xB5	(keypad) / released
0xE0, 0x38	right alt (or altGr) pressed			0xE0, 0xB8	right alt (or altGr) released					
0xE0, 0x47	home pressed							0xE0, 0xC7	home released
0xE0, 0x48	cursor up pressed						0xE0, 0xC8	cursor up released
0xE0, 0x49	page up pressed							0xE0, 0xC9	page up released
0xE0, 0x4B	cursor left pressed						0xE0, 0xCB	cursor left released
0xE0, 0x4D	cursor right pressed					0xE0, 0xCD	cursor right released
0xE0, 0x4F	end pressed								0xE0, 0xCF	end released
0xE0, 0x50	cursor down pressed						0xE0, 0xD0	cursor down released
0xE0, 0x51	page down pressed						0xE0, 0xD1	page down released
0xE0, 0x52	insert pressed							0xE0, 0xD2	insert released
0xE0, 0x53	delete pressed							0xE0, 0xD3	delete released
0xE0, 0x5B	win pressed								0xE0, 0xDB	win released
0xE0, 0x5E	(ACPI) power pressed					0xE0, 0xDE	(ACPI) power released
0xE0, 0x5F	(ACPI) sleep pressed					0xE0, 0xDF	(ACPI) sleep released
0xE0, 0x63	(ACPI) wake pressed						0xE0, 0xE3	(ACPI) wake released
0xE0, 0x2A, 0xE0, 0x37	print screen pressed		0xE0, 0xB7, 0xE0, 0xAA	print screen released
0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5	pause pressed
*/

#define kb_input_buf_max_sz		(64)

typedef struct kb_input_buffer
{
	listnode_t ownerlist;
	unsigned int head;
	unsigned int tail;
	unsigned int buf_size;
	unsigned int* buffer;
}
kb_input_buffer_t;

#define kb_input_buffer_is_empty(p)	((p)->head == (p)->tail + 1)
#define kb_input_buffer_is_full(p) ((p)->head == (p)->tail)

// global initialization
void global_init_keyboard_module(void);

#ifdef __cplusplus
}
#endif
#endif
/* EOF */
